/**
 * # 数据实体类:
 *  Notification - 通知
 * 
 * # 描述:
 *  一条已经发送或接收到的通知消息。
 *  
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.notifying.service.data;

/**
 * 通知。
 * 
 * 一条已经发送或接收到的通知消息。
 */
public final class Notification extends pittypat.DataModel {
	/**
	 * Id。
	 * <p>
	 * 消息的 Id。
	 */
	public java.util.UUID id;

	/**
	 * 发送用户的 Id。
	 * <p>
	 * 发送消息的用户的 Id，如果是系统消息，则为 null。
	 */
	public java.util.UUID senderId;

	/**
	 * 接收用户的 Id。
	 * <p>
	 * 接收消息的用户的 Id，如果是广播消息，则为 null。
	 */
	public java.util.UUID receiverId;

	/**
	 * 接收人名称。
	 * <p>
	 * 接收人的名称。
	 */
	public String receiverName;

	/**
	 * 接收人头像路径。
	 * <p>
	 * 接收人头像文件的路径。
	 */
	public String receiverFaceUrl;

	/**
	 * 接收时间。
	 * <p>
	 * 消息的接收时间。
	 */
	public java.time.LocalDateTime receiveTime;

	/**
	 * 阅读时间。
	 * <p>
	 * 接收人阅读通知的时间，如果尚未阅读，为 null。
	 */
	public java.time.LocalDateTime readTime;

	/**
	 * 紧急程度。
	 * <p>
	 * 通知的紧急程度代码：1-常规，2-紧急，4-特急。默认为常规（1）。
	 */
	public Byte urgency;

	/**
	 * 分组。
	 * <p>
	 * 通知隶属的分组。
	 */
	public String group;

	/**
	 * 通知标题。
	 * <p>
	 * 通知的标题。
	 */
	public String title;

	/**
	 * 通知消息摘要。
	 * <p>
	 * 对通知消息正文的摘要信息。
	 */
	public String summary;

	/**
	 * 通知正文内容。
	 * <p>
	 * 通知的完整正文内容。
	 */
	public String body;

	/**
	 * 正文类型代码。
	 * <p>
	 * 消息正文类型代码：1-纯文本，2-HTML。
	 */
	public Byte bodyType;

	/**
	 * 目标功能路径。
	 * <p>
	 * 点击消息时要进入的路径。
	 */
	public String funcUrl;

	/**
	 * 引用数据的类型。
	 * <p>
	 * 如果此消息来自某业务功能，则可能引用某业务数据，此属性定义业务数据的类型。
	 */
	public String refDataType;

	/**
	 * 引用数据键值。
	 * <p>
	 * 消息引用数据的键值。
	 */
	public String refDataKey;

	/**
	 * 附件 Id。
	 * <p>
	 * 通知消息的附件文件的数目。
	 */
	public java.util.UUID attachmentId;

	/**
	 * 初始化 Notification 类的一个新实例。
	 */
	public Notification() {
		super();

		// Id
		this.id = null;
		// 发送用户的 Id
		this.senderId = null;
		// 接收用户的 Id
		this.receiverId = null;
		// 接收人名称
		this.receiverName = null;
		// 接收人头像路径
		this.receiverFaceUrl = null;
		// 接收时间
		this.receiveTime = null;
		// 阅读时间
		this.readTime = null;
		// 紧急程度
		this.urgency = null;
		// 分组
		this.group = null;
		// 通知标题
		this.title = null;
		// 通知消息摘要
		this.summary = null;
		// 通知正文内容
		this.body = null;
		// 正文类型代码
		this.bodyType = null;
		// 目标功能路径
		this.funcUrl = null;
		// 引用数据的类型
		this.refDataType = null;
		// 引用数据键值
		this.refDataKey = null;
		// 附件 Id
		this.attachmentId = null;
	}

	/**
	 * 从一个 DbDataReader 中读取此对象。
	 * 
	 * @param reader
	 * 			包含对象数据的 DbDataReader 对象。
	 * 
	 * @throws IllegalArgumentException
	 * 
	 * @see pittypat.DataModel#read(pittypat.data.DbDataReader)
	 * @see pittypat.data.DbDataReader
	 */
	@Override
	public void read(pittypat.data.DbDataReader reader) throws IllegalArgumentException {
		if (reader == null) {
			throw new IllegalArgumentException("reader 为 null。");
		}

		// Id
		this.id = reader.getUuid("id", this.id);
		// 发送用户的 Id
		this.senderId = reader.getUuid("senderId", this.senderId);
		// 接收用户的 Id
		this.receiverId = reader.getUuid("receiverId", this.receiverId);
		// 接收人名称
		this.receiverName = reader.getString("receiverName", this.receiverName);
		// 接收人头像路径
		this.receiverFaceUrl = reader.getString("receiverFaceUrl", this.receiverFaceUrl);
		// 接收时间
		this.receiveTime = reader.getDateTime("receiveTime", this.receiveTime);
		// 阅读时间
		this.readTime = reader.getDateTime("readTime", this.readTime);
		// 紧急程度
		this.urgency = reader.getByte("urgency", this.urgency);
		// 分组
		this.group = reader.getString("group", this.group);
		// 通知标题
		this.title = reader.getString("title", this.title);
		// 通知消息摘要
		this.summary = reader.getString("summary", this.summary);
		// 通知正文内容
		this.body = reader.getString("body", this.body);
		// 正文类型代码
		this.bodyType = reader.getByte("bodyType", this.bodyType);
		// 目标功能路径
		this.funcUrl = reader.getString("funcUrl", this.funcUrl);
		// 引用数据的类型
		this.refDataType = reader.getString("refDataType", this.refDataType);
		// 引用数据键值
		this.refDataKey = reader.getString("refDataKey", this.refDataKey);
		// 附件 Id
		this.attachmentId = reader.getUuid("attachmentId", this.attachmentId);
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 * 			目标文本流。
	 * 
	 * @throws IllegalArgumentException
	 * @throws java.io.IOException
	 * 
	 * @see pittypat.DataModel#write(java.io.Writer)
	 */
	@Override
	public void write(java.io.Writer writer) throws IllegalArgumentException, java.io.IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('{');

		// Id
		writer.write("\"id\":");
		pittypat.Json.write(writer, this.id);
		writer.write(',');

		// 发送用户的 Id
		writer.write("\"senderId\":");
		pittypat.Json.write(writer, this.senderId);
		writer.write(',');

		// 接收用户的 Id
		writer.write("\"receiverId\":");
		pittypat.Json.write(writer, this.receiverId);
		writer.write(',');

		// 接收人名称
		writer.write("\"receiverName\":");
		pittypat.Json.write(writer, this.receiverName);
		writer.write(',');

		// 接收人头像路径
		writer.write("\"receiverFaceUrl\":");
		pittypat.Json.write(writer, this.receiverFaceUrl);
		writer.write(',');

		// 接收时间
		writer.write("\"receiveTime\":");
		pittypat.Json.write(writer, this.receiveTime);
		writer.write(',');

		// 阅读时间
		writer.write("\"readTime\":");
		pittypat.Json.write(writer, this.readTime);
		writer.write(',');

		// 紧急程度
		writer.write("\"urgency\":");
		pittypat.Json.write(writer, this.urgency);
		writer.write(',');

		// 分组
		writer.write("\"group\":");
		pittypat.Json.write(writer, this.group);
		writer.write(',');

		// 通知标题
		writer.write("\"title\":");
		pittypat.Json.write(writer, this.title);
		writer.write(',');

		// 通知消息摘要
		writer.write("\"summary\":");
		pittypat.Json.write(writer, this.summary);
		writer.write(',');

		// 通知正文内容
		writer.write("\"body\":");
		pittypat.Json.write(writer, this.body);
		writer.write(',');

		// 正文类型代码
		writer.write("\"bodyType\":");
		pittypat.Json.write(writer, this.bodyType);
		writer.write(',');

		// 目标功能路径
		writer.write("\"funcUrl\":");
		pittypat.Json.write(writer, this.funcUrl);
		writer.write(',');

		// 引用数据的类型
		writer.write("\"refDataType\":");
		pittypat.Json.write(writer, this.refDataType);
		writer.write(',');

		// 引用数据键值
		writer.write("\"refDataKey\":");
		pittypat.Json.write(writer, this.refDataKey);
		writer.write(',');

		// 附件 Id
		writer.write("\"attachmentId\":");
		pittypat.Json.write(writer, this.attachmentId);

		writer.write('}');
	}
}
